package org.example.day05;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO+
 * <div>  某个产品当前迭代周期内有N个特性（<img src="https://www.nowcoder.com/equation?tex=%5C%7BF_1%2CF_2%2C...%2CF_N%5C%7D">）需要进行覆盖测试，每个特性都被评估了对应的优先级，特性使用其ID作为下标进行标识。 </div> <div>  设计了M个测试用例（<img src="https://www.nowcoder.com/equation?tex=%5C%7BT1%2CT2%2C...%2CT_M%5C%7D">），每个用例对应了一个覆盖特性的集合，测试用例使用其ID作为下标进行标识，测试用例的优先级定义为其覆盖的特性的优先级之和。 </div> <div>  在开展测试之前，需要制定测试用例的执行顺序，规则为：优先级大的用例先执行，如果存在优先级相同的用例，用例ID小的先执行。 </div>
 * <p>
 * 某个产品当前迭代周期内有N个特性（ ）需要进行覆盖测试，每个特性都被评估了对应的优先级，特性使用其ID作为下标进行标识。
 * 设计了M个测试用例（ ），每个用例对应了一个覆盖特性的集合，测试用例使用其ID作为下标进行标识，测试用例的优先级定义为其覆盖的特性的优先级之和。
 * 在开展测试之前，需要制定测试用例的执行顺序，规则为：优先级大的用例先执行，如果存在优先级相同的用例，用例ID小的先执行。
 * @date 2024/3/11 15:22
 */
public class test096 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt(); // 特性的数量
        int M = scanner.nextInt(); // 测试用例的数量
        scanner.nextLine(); // 读取换行符

        // 读取特性优先级
        int[] featurePriority = new int[N];
        for (int i = 0; i < N; i++) {
            featurePriority[i] = scanner.nextInt();
        }

        // 读取测试用例的特性覆盖集合，并计算优先级
        List<TestCase> testCases = new ArrayList<>();
        for (int i = 0; i < M; i++) {
            String line = scanner.nextLine().trim();
            if (line.isEmpty()) {
                line = scanner.nextLine().trim(); // 跳过空行
            }
            String[] features = line.split(" ");
            int priority = 0;
            for (String feature : features) {
                int featureId = Integer.parseInt(feature) - 1; // 特性ID从1开始，数组下标从0开始
                priority += featurePriority[featureId];
            }
            testCases.add(new TestCase(i + 1, priority));
        }

        // 对测试用例按照优先级和ID排序
        Collections.sort(testCases, (a, b) -> {
            if (a.priority != b.priority) {
                return b.priority - a.priority; // 优先级大的在前
            }
            return a.id - b.id; // ID小的在前
        });

        // 输出执行顺序
        for (TestCase testCase : testCases) {
            System.out.println(testCase.id);
        }

        scanner.close();
    }

    // 测试用例类，包含ID和优先级属性
    static class TestCase {
        int id;
        int priority;

        public TestCase(int id, int priority) {
            this.id = id;
            this.priority = priority;
        }
    }
}

